<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    /* 
        闭包: 
            有权访问上级作用域变量和方法的函数
            简单的来说,就是函数在执行过程中返回了另一个或多个函数,返回的函数中使用父作用域中的变量和方法 

        形成条件
            1. 函数在执行过程中返回了另一个或多个函数
            2. 返回的函数中使用父作用域中的变量
            3. 函数外有变量引入返回的一个或多个函数

        闭包的优点
            1. 减少全局变量的使用  => 模块化出现之前,代码优化方案
            2. 可以函数外访问函数内的数据
            
        闭包的缺点:
            1. 可以函数外访问函数内的数据 => 不安全
            2. 父作用域中对应的AO对象一直得不到释放, 闭包使用过多会造成内存泄漏
    */



    // 返回一个函数
    function fn(){
        var a = 1; // 2

        function addA(){
            a++;
        }

        function reduceA(){
            a--;
        }

        // function getA(){
        //     return a;
        // }

        // function setA(val){
        //     a = val;
        // }

        return {
            addA,
            reduceA,
            // getA,
            // setA,
            
            get a(){ // a属性
                return a;   // 父作用域中的变量a
            },
            set a(val){
                a = val;
            }
        }

    }

    var result = fn();  // result = func
    console.log(result);

    result.addA();

    console.log(result.a);






</script>
</html>